package com.hspedu.poly_.detail;

/**
 * @Author Stringzhua
 * @Date 2024/3/2 17:26
 * description:测试方法
 */
public class PolyDetail {
    public static void main(String[] args) {
        //向上转型:父类的引用指向了子类的对象
        //语法:父类类型引用名=new 子类类型();
        Animal animal = new Cat();
        Object obj = new Cat();//可以 Object也是Cat的父类

        //向上转型调用方法的规则
        //成员--->属性和方法
        //1.可以调用父类中的所有成员(需遵守访问权限)
        //2.但是不能调用子类的特有的成员
        //3.因为在编译阶段,能调用哪些成员,是由编译类型决定的
//        animal.catchMouse();
        //4.最终的运行效果看子类的具体实现
        //即调用方法时,按照默认子类开始查找方法
        //然后调用,规则与方法调用规则一致
        animal.eat();//猫吃鱼~
        animal.run();//跑
        animal.show();//hello,Stringzhua
        animal.sleep();//睡

        //希望调用Cat的catchMouse方法
//        animal.catchMouse();//报错
        //多态的向下转型
        //1.语法:子类类型 引用名=(子类类型) 父类引用;
        //问cat的编译类型 Cat,运行类型是Cat
        Cat cat = (Cat) animal;
        cat.catchMouse();//猫抓老鼠~
        //2.要求父类的引用必须指向的是当前目标类型的对象
        Dog dog = (Dog) animal;
        //com.hspedu.poly_.detail.Cat cannot be cast to com.hspedu.poly_.detail.Dog at com.hspedu.poly_.detail.PolyDetail.main(PolyDetail.java:37)

        System.out.println("ok~");
    }
}
